import os.path
from configparser import ConfigParser, NoSectionError, NoOptionError

from config.sys_path import LOCATORS_DIR
from sample.common.my_log import my_log


class ElementLocators(ConfigParser):
    """
    读取指定目录下，所有ini配置文件的内容
    """

    def __init__(self, path):
        super().__init__()
        self.el_ini_file_list = []
        for filewalks in os.walk(path):
            for file in filewalks[2]:
                if '.ini' in file:
                    self.el_ini_file_list.append(os.path.join(filewalks[0], file))
        self.read(self.el_ini_file_list, encoding='utf-8')

    def optionxform(self, optionstr: str) -> str:
        """重写ConfigParser此方法，用于使option区分大小写"""
        return optionstr

    def __get_el_from_ini(self, el_name, *values):
        """根据配置文件ini中的section.option获取对应的元素定位
        :param el_name:元素名称，格式为ini文件中的section.option，即 页面名称.元素名称。
        :param values: 如果该元素定位中存在{}占位符，则以values代替。
        :return : 若找到元素名称，则返回ini文件中对应的元素定位；若未发现，则返回el_name
        """
        try:
            section = el_name.split('.')[0]
            option = el_name.split('.')[1]
        except IndexError:
            my_log.debug(f'输入的元素名称不符合格式section.option，方法将直接返回原字符串{el_name}')
            return el_name
        else:
            try:
                value = self.get(section, option)
                if values:
                    value = value.format(*values)
            except NoSectionError:
                my_log.debug(
                    f'【{os.path.basename(LOCATORS_DIR)}】目录下，没有section={section}，若确认无误可忽略此提示')
                return el_name
            except NoOptionError:
                my_log.debug(
                    f'【{os.path.basename(LOCATORS_DIR)}】目录下，没有option={option}，若确认无误可忽略此提示')
                return el_name
            else:
                return value

    @staticmethod
    def get_el_and_format(element_name: str):
        """
        通过get_el_from_ini()方法，从ini文件获取元素名称对应的元素定位，并对其中的占位符进行替换。
        :param element_name:元素名称，格式为section.option,placeholder
        其中placeholder表示替换占位符的值。
        """
        el_name = element_name
        values = []
        if ',' in element_name and not element_name.endswith(','):
            el_list = element_name.split(',')
            el_name = el_list[0]  # 取section.option
            values = el_list[1:]  # 取placeholder
        return_el = el.__get_el_from_ini(el_name, *values)
        if return_el == el_name:
            # 返回值等于el_name，说明未在ini文件找到对应内容，直接返回原字符串即可
            my_log.debug(
                f'【{os.path.basename(LOCATORS_DIR)}】目录下未找到对应信息，返回值为原字符串{element_name}')
            return element_name
        else:
            return return_el


el = ElementLocators(LOCATORS_DIR)  # 直接读取LOCATORS目录下，所有ini文件的元素定位信息到el

if __name__ == '__main__':

    print('-----------------原生方法，占位符需要.format()替换----------------')
    x = el.get('BuyersLogin', 'ConfirmBtn')
    print(x.format('取消', '确定'))

    print('-----------------封装的get_el_from_ini方法----------------')
    print(el.__get_el_from_ini('BuyersLogin.ConfirmBtn'))
    print(el.__get_el_from_ini('BuyersLogin.ConfirmBtn', '哈哈1', '嘿嘿2'))

    print('------------------封装的get_el_and_format方法---------------')
    print(el.get_el_and_format('Login_Page.page1.dialog cf.btn'))
    print(el.get_el_and_format('//span[text="qued"]'))
    print(el.get_el_and_format('//span[text="qu.e,d"]'))
    print(el.get_el_and_format('BuyersLogin.ConfirmBtn,'))
    print(el.get_el_and_format('BuyersLogin.ConfirmBtn'))
    print(el.get_el_and_format('BuyersLogin.ConfirmBtn,替换1,替换2'))
